package main

import "fmt"

func main() {
	//map的定义
	//语法：var关键字 变量名 map[键类型]值类型 （推荐使用make）
	//var mp map[string]string  //这种声明方式，不会申请内存
	//mp["name"] = "zhangsan"
	//fmt.Println(mp)
	//正确方法，初始化分配内存
	//第一种，make，用于引用类型的声明slice map channel
	var mp2 = make(map[string]string)
	mp2["name"] = "lisi"
	mp2["age"] = "10"
	mp2["sex"] = "male"
	fmt.Printf("%T %v\n", mp2, mp2)
	//第二种，初始化使用{}赋值
	var mp3 = map[string]string{}
	mp3["name"] = "lisi"
	mp3["age"] = "10"
	mp3["sex"] = "male"
	fmt.Printf("%T %v\n", mp3, mp3)

	//判断某个键是否存在
	var mp4 = map[string]string{
		"username": "zhangsan",
		"password": "123456",
	}
	//这样用ok，但是确保username这个key一定存在这个map中
	val := mp4["username"]
	fmt.Println(val)
	//这种方式提供是否取到的结果
	//val, ok := mp4["username"]
	//if ok {
	//	fmt.Println(val)
	//}else {
	//	fmt.Println("map中不存在该key")
	//}

	//删除某个key和value
	//delete()内置函数，专门删除map的key和value
	delete(mp4, "username")
	fmt.Println(mp4)

	//map遍历
	var mp5 = map[string]int{
		"zhangsan": 30,
		"lisi":     29,
		"wangwu":   18,
	}
	for key, value := range mp5 {
		fmt.Println(key, value)
	}
	//只遍历key
	for key := range mp5 {
		fmt.Println(key)
	}
	//只遍历value
	for _, value := range mp5 {
		fmt.Println(value)
	}
}
